﻿using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;

namespace GreenXi.Help.PLC
{
    public static class PLCConverter
    {
        //string转换成PLCString
        public static string ConvertStringToPLCString(string str)
        {
            // 将输入字符串转换为字节数组
            byte[] bytes = Encoding.UTF8.GetBytes(str);

            // 计算字节数组的长度，并将其转换为16进制表示的字符串
            string lengthHex = bytes.Length.ToString("X4").ToLower();

            var unicodeStr = Regex.Unescape($"\\u{lengthHex}");

            // 构造转换后的字符串
            string result = "2" + unicodeStr + str;
            return result;
        }

        //PLCstring转换成String
        public static string ConvertPLCStringToString(string plcString)
        {
            // 截取起始索引之后的部分作为数据
            //plcString = plcString.Replace("\n", "").Replace("\0", "");
            string pattern = @"[\p{Cc}]";
            Match match = Regex.Match(plcString, pattern);
            if (match.Success)
            {
                char controlChar = match.Value[0];
                string hexNumber = ((int)controlChar).ToString("X4");
                int decimalNumber = int.Parse(hexNumber, System.Globalization.NumberStyles.HexNumber);
                pattern = @$"{controlChar}([\s\S]*)";
                match = Regex.Match(plcString, pattern);
                plcString = match.Groups[1].Value[..decimalNumber];
            }
            return plcString;
        }


        //String[]中所有的string转换成PLCString
        public static string[] ConvertStringArrayToPLCStringArray(string[] array)
        {
            List<string> result = new();

            foreach (string str in array)
            {
                // 将输入字符串转换为字节数组
                byte[] bytes = Encoding.UTF8.GetBytes(str);

                // 计算字节数组的长度，并将其转换为16进制表示的字符串
                string lengthHex = bytes.Length.ToString("X4").ToLower();

                var unicodeStr = Regex.Unescape($"\\u{lengthHex}");

                // 构造转换后的字符串，并添加到结果列表中
                string plcString = "2" + unicodeStr + str;
                result.Add(plcString);
            }
            return result.ToArray();
        }

        //PLCString[]中所有的PLCString转换成String
        public static string[] ConvertPLCStringArrayToStringArray(string[] plcStringArray)
        {
            List<string> result = new();

            foreach (string plcString in plcStringArray)
            {
                // 将数据部分转换为字符串，并添加到结果列表中
                string output = ConvertPLCStringToString(plcString);
                result.Add(output);
            }

            return result.ToArray();
        }
    }
}
